/*
 * Copyright (c) 1995, 2004, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang;

/**
 * 当应用程序尝试通过字符串名称加载类时抛出，使用以下方法：
 * <ul>
 * <li><code>Class</code> 类中的 <code>forName</code> 方法。
 * <li><code>ClassLoader</code> 类中的 <code>findSystemClass</code> 方法。
 * <li><code>ClassLoader</code> 类中的 <code>loadClass</code> 方法。
 * </ul>
 * <p>
 * 但找不到具有指定名称的类的定义。
 *
 * <p>从 1.4 版本开始，此异常已经改进以符合通用异常链机制。
 * 在构造时可能提供并通过 {@link #getException()} 方法访问的
 * "加载类时引发的可选异常" 现在被称为<i>原因</i>，
 * 可以通过 {@link Throwable#getCause()} 方法以及前述的"遗留方法"来访问。
 *
 * @author  unascribed
 * @see     java.lang.Class#forName(java.lang.String)
 * @see     java.lang.ClassLoader#findSystemClass(java.lang.String)
 * @see     java.lang.ClassLoader#loadClass(java.lang.String, boolean)
 * @since   JDK1.0
 */
public class ClassNotFoundException extends ReflectiveOperationException {
    /**
     * use serialVersionUID from JDK 1.1.X for interoperability
     */
     private static final long serialVersionUID = 9176873029745254542L;

    /**
     * 如果使用 ClassNotFoundException(String s, Throwable ex) 构造方法
     * 实例化对象，此字段保存异常 ex
     * @serial
     * @since 1.2
     */
    private Throwable ex;

    /**
     * 构造一个没有详细消息的 <code>ClassNotFoundException</code>。
     */
    public ClassNotFoundException() {
        super((Throwable)null);  // Disallow initCause
    }

    /**
     * 构造一个具有指定详细消息的 <code>ClassNotFoundException</code>。
     *
     * @param   s   详细消息。
     */
    public ClassNotFoundException(String s) {
        super(s, null);  //  Disallow initCause
    }

    /**
     * 构造一个具有指定详细消息和在加载类时引发的可选异常的
     * <code>ClassNotFoundException</code>。
     *
     * @param s 详细消息
     * @param ex 加载类时引发的异常
     * @since 1.2
     */
    public ClassNotFoundException(String s, Throwable ex) {
        super(s, null);  //  Disallow initCause
        this.ex = ex;
    }

    /**
     * 如果在尝试加载类时发生错误，则返回引发的异常。否则，返回 <tt>null</tt>。
     *
     * <p>此方法早于通用异常链机制。
     * {@link Throwable#getCause()} 方法现在是获取此信息的首选方式。
     *
     * @return 加载类时引发的 <code>Exception</code>
     * @since 1.2
     */
    public Throwable getException() {
        return ex;
    }

    /**
     * 返回此异常的原因（如果在尝试加载类时发生错误则返回引发的异常；
     * 否则返回 <tt>null</tt>）。
     *
     * @return  此异常的原因。
     * @since   1.4
     */
    public Throwable getCause() {
        return ex;
    }
}
